iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
Modern Web

.NET教我做人系列 第 26

Day26 CORS(跨來源資源共用)

  • 分享至 

  • xImage
  •  

大家好啊~今天又要來介紹好玩的東西,不知道大家有沒有想過,今天我們瀏覽網頁時,我們點了一個連結後,到了一個跟觀望很像的網頁,但其實這網頁是有人惡意寫的,像這種釣魚網站的問題我們一怎麼解決

CORS

瀏覽器安全性可防止網頁向提供網頁的不同網域提出要求。 此限制稱為相同原始來源原則。 相同的來源原則可防止惡意網站從另一個網站讀取敏感性資料。 有時候,您可能想要允許其他網站對您的應用程式提出跨原始來源要求

優點

  • 這是 W3C 標準,可讓伺服器放寬相同的原始來源原則
  • 不是安全性功能,CORS 會放寬安全性。 藉由允許 CORS,API 並不更安全
  • 允許伺服器明確允許某些跨原始來源要求,同時拒絕其他要求
  • 比舊版技術更安全且更有彈性

使用方式

在中介軟體中使用具名原則或預設原則

var  MyAllowSpecificOrigins = "_myAllowSpecificOrigins";

builder.Services.AddCors(options =>
{
    options.AddPolicy(name: MyAllowSpecificOrigins,
                      policy  =>{                    policy.WithOrigins("http://example.com","http://www.contoso.com");
                      }
    );
});

這裡我們限定的URL 就是WithOrigins裡的http://example.com 和 http://www.contoso.com

再來我們還要記得去使用它

app.UseCors(MyAllowSpecificOrigins);

使用端點路由時,CORS中介軟體必須設定為在 對 和 UseEndpoints 的呼叫 UseRouting 之間執行

端點路由

端點路由是使用 RequireCors 啟用個別端點的 CORS不支援自動預檢要求

這裡我們在端點的地方去使用Cors,記得要使用在UseCors 和UseAuthorization 之後

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/echo",
        context => context.Response.WriteAsync("echo"))
        .RequireCors(MyAllowSpecificOrigins);

    endpoints.MapControllers()
             .RequireCors(MyAllowSpecificOrigins);

    endpoints.MapGet("/echo2",
        context => context.Response.WriteAsync("echo2"));

    endpoints.MapRazorPages();
});

[EnableCors]

接著我們在上面設定好我們的CORS 後接下來就是要到使用 [EnableCors] 屬性啟用 CORS,並將具名原則套用至只有需要 CORS 的端點可提供最精細的控制,我們可以在EnableCors 加上指定的具名

使用範圍

  • Razor 網頁 PageModel
  • 控制器
  • 控制器動作方法
[EnableCors]
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
    var user = await _context.Users.FindAsync(id);

    if (user == null)
    {
        return NotFound();
    }

    return user;
}

[EnableCors("AnotherPolicy")]
[HttpPut("{id}")]
public async Task<IActionResult> PutUser(int id, User user)
{
    if (id != user.Id)
    {
        return BadRequest();
    }

    _context.Entry(user).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!UserExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

要是我們不想要使用CORS 的話可以用DisableCors

今天的話就先到這邊,我們明天見~~~

參考資料:
https://learn.microsoft.com/zh-tw/aspnet/core/security/cors?view=aspnetcore-6.0


上一篇
Day25 檔案上傳
下一篇
Day27 如何發送電子郵件
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言